//
//  iWeb - WidgetCommon.js
//  Copyright (c) 2007 Apple Inc. All rights reserved.
//

var widgets=[];
var identifiersToStringLocalizations=[];

function Widget(instanceID,widgetPath,sharedPath,sitePath,preferences,runningInApp){
	if(instanceID){
		this.instanceID=instanceID;
		this.widgetPath=widgetPath;
		this.sharedPath=sharedPath;
		this.sitePath=sitePath;
		this.preferences=preferences;
		this.runningInApp=(runningInApp===undefined)?false:runningInApp;
		this.onloadReceived=false;
		if(this.preferences&&this.runningInApp==true){
			this.preferences.widget=this;
			setTransparentGifURL(this.sharedPath.stringByAppendingPathComponent("None.gif"));
			}
		this.div().widget=this;
		window[instanceID]=this;
		widgets.push(this);
		widgets[instanceID]=this;
		if(!this.constructor.instances){
			this.constructor.instances=new Array();
			}
		this.constructor.instances.push(this);
		}
	}

Widget.prototype.div=function(){
	var divID=this.instanceID;
	if(arguments.length==1){
		divID=this.instanceID+"-"+arguments[0];
		}
	return $(divID);
	}
	
Widget.prototype.onload=function(){this.onloadReceived=true;}
Widget.prototype.onunload=function(){}
Widget.prototype.didBecomeSelected=function(){}
Widget.prototype.didBecomeDeselected=function(){}
Widget.prototype.didBeginEditing=function(){}
Widget.prototype.didEndEditing=function(){}
Widget.prototype.setNeedsDisplay=function(){}
Widget.prototype.preferenceForKey=function(key){
	var value;
	if(this.preferences)value=this.preferences[key];
	return value;
	}
	
Widget.prototype.initializeDefaultPreferences=function(prefs){
	var self=this;
	Object.keys(prefs).forEach(
		function(pref){
			if(self.preferenceForKey(pref)===undefined){
				self.setPreferenceForKey(prefs[pref],pref);
				}
			}
		);
	}
	
Widget.prototype.setPreferenceForKey=function(preference,key,registerUndo){
	if(this.runningInApp){
		if(registerUndo===undefined)registerUndo=true;
		if((registerUndo==false)&&this.preferences.disableUndoRegistration)this.preferences.disableUndoRegistration();
		this.preferences[key]=preference;
		if((registerUndo==false)&&this.preferences.enableUndoRegistration)this.preferences.enableUndoRegistration();
		}
	else{
		this.preferences[key]=preference;
		this.changedPreferenceForKey(key);
		}
	}

Widget.prototype.changedPreferenceForKey=function(key){}
Widget.prototype.postNotificationWithNameAndUserInfo=function(name,userInfo){
	if(window.NotificationCenter!==undefined){
		NotificationCenter.postNotification(new IWNotification(name,null,userInfo));
		}
	}
	
Widget.prototype.sizeWillChange=function(){}
Widget.prototype.sizeDidChange=function(){}
Widget.prototype.widgetWidth=function(){
	var enclosingDiv=this.div();
	if(enclosingDiv)return enclosingDiv.offsetWidth;
	else return null;
	}
	
Widget.prototype.widgetHeight=function(){
	var enclosingDiv=this.div();
	if(enclosingDiv)return enclosingDiv.offsetHeight;
	else return null;
	}
	
Widget.prototype.getInstanceId=function(id){
	var fullId=this.instanceID+"-"+id;
	if(arguments.length==2){
		fullId+=("$"+arguments[1]);
		}
	return fullId;
	}
	
Widget.prototype.getElementById=function(id){
	var fullId=this.getInstanceId.apply(this,arguments);
	return $(fullId);
	}
	
Widget.prototype.localizedString=function(string){
	return LocalizedString(this.widgetIdentifier,string);
	}
	
Widget.onload=function(){
	for(var i=0;i<widgets.length;i++){
		widgets[i].onload();
		}
	}
	
Widget.onunload=function(){
	for(var i=0;i<widgets.length;i++){
		widgets[i].onunload();
		}
	}
	
function RegisterWidgetStrings(identifier,strings){
	identifiersToStringLocalizations[identifier]=strings;
	}
	
function LocalizedString(identifier,string){
	var localized=undefined;
	var localizations=identifiersToStringLocalizations[identifier];
	if(localizations===undefined){
		iWLog("warning: no localizations for widget "+identifier+", (key:"+string+")");
		}
	else{
	localized=localizations[string];
	}
	if(localized===undefined){
		iWLog("warning: couldn't find a localization for '"+string+"' for widget "+identifier);
		localized=string;
		}
	return localized;
	}
	
function WriteLocalizedString(identifier,string){
	document.write(LocalizedString(identifier,string));
	}


