Function.prototype.bindevent = function(scope, args){
	var method = this;
	if(args === undefined){
		args = [];
	}
	return function() {
		return method.apply(scope, args.concat(arguments));
	}
}
var Ylmf = function(sele){
	var self = this;
	
	var init = function(selector){
		selector = selector || document;
		var elem;
		if ( selector.nodeType ) {
			elem = selector;
		}
		else if(typeof selector == "string"){
			elem = document.getElementById(selector);
		}
		else{
			return null;
		}
		if(elem){
			//扩展DOM
			elem.addClass = function(classNames){
				var col = (classNames || "").split(/\s+/);
				for(var i = 0; i < col.length; i++){
					var item = col[i];
					if(elem.nodeType == 1 && !Ylmf.common.has(elem,item)){
						elem.className += (elem.className ? " " : "") + item;
					}
				}
			},
			elem.removeClass = function(classNames){
				if (elem.nodeType == 1){
					if(classNames != undefined){
						var col = elem.className.split(/\s+/);
						var hasCol = [];
						
						for(var i = 0,length = col.length; i < length; i++){
							var item = col[i];
							if(!Ylmf.common.has(classNames,item)){
								hasCol.push(item);
							}
						}
						
						elem.className = hasCol.join(" ");
					}
					else{
						elem.className = "";
					}
				}
			},		
			elem.bind = function(type, handler, data){
				var typeArr = type.split(",");
				if(typeArr.length){
					for(var i = 0,len = typeArr.length; i < len; i++){
						var item = typeArr[i];
						Ylmf.event.add(elem, item, handler, data);
					}
				}
			},
			elem.css = function(options){
				for(var name in options){
					if (!elem.hasOwnProperty(name)) {
						continue;
					}
					Ylmf.style(elem,name,options[name]);
				}
			},
			elem.tagNodes = function(tagName){
				return elem.getElementsByTagName(tagName);
			},
			elem.attr = function(key,value){
				return Ylmf.attr(elem,key,value);
			},
			elem.parent = function(){
				return $(elem.parentNode);
			},
			elem.find = function(tagName,selector){
				if(selector){
					return Ylmf.find(elem,tagName,selector);
				}
				else{
					return Ylmf.find(elem,tagName,tagName);
				}
			},
			elem.offset = function(){
				var left = 0, top = 0, results;
				if ( elem ) with ( Ylmf.browser ) {
					var parent       = elem.parentNode, 
						offsetChild  = elem,
						offsetParent = elem.offsetParent, 
						doc          = elem.ownerDocument,
						safari2      = safari && parseInt(version) < 522,
						fixed        = elem.style.position == "fixed";
					if ( elem.getBoundingClientRect ) {
						var box = elem.getBoundingClientRect();
						add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
							box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
						add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
				
					// Otherwise loop through the offsetParents and parentNodes
					} else {
						add( elem.offsetLeft, elem.offsetTop );
						while ( offsetParent ) {
							add( offsetParent.offsetLeft, offsetParent.offsetTop );
							if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
								border( offsetParent );
							if ( !fixed && offsetParent.style.position == "fixed" )
								fixed = true;
							offsetChild  = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
							offsetParent = offsetParent.offsetParent;
						}
					
						while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
							if ( !/^inline|table.*$/i.test( parent.style.display) )
								// Subtract parent scroll offsets
								add( -parent.scrollLeft, -parent.scrollTop );
						
							// Mozilla does not add the border for a parent that has overflow != visible
							if ( mozilla && parent.style.overflow != "visible" )
								border( parent );
						
							// Get next parent
							parent = parent.parentNode;
						}
						if ( (safari2 && (fixed || offsetChild.style.position == "absolute")) || 
							(mozilla && offsetChild.style.position != "absolute") )
								add( -doc.body.offsetLeft, -doc.body.offsetTop );
						if ( fixed )
							add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
								Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
					}
					results = { top: top, left: left };
				}
				
				function border(elem) {
				}
			
				function add(l, t) {
					left += parseInt(l) || 0;
					top += parseInt(t) || 0;
				}
			
				return results;
			}
		}
		return elem;
	}
	return init(sele);
}

//浏览器判断
var userAgent = navigator.userAgent.toLowerCase();
Ylmf.browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
}

//基础数据类型
Ylmf.data = {
	readyFn:[],	//初始化执行函数列表
	isReady:false,
	selector:{
		attr:/\[.*\]/
	}
};

/*
取出属性值
*/
Ylmf.attr = function(elem,key,value){
	if(value){
		elem.setAttribute(key,value);
	}
	else{
		return elem.getAttribute(key);
	}
}

Ylmf.filterClass = function(elem,m){
	m = " " + m + " ";
	return (" " + elem.className + " ").indexOf( m ) >= 0;
}

var chars = Ylmf.browser.safari && parseInt(Ylmf.browser.version) < 417 ?
		"(?:[\\w*_-]|\\\\.)" :
		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
	quickClass = new RegExp("^([%.]?)(.*)");
	
Ylmf.find = function(ele,tagName,selector){
	if(typeof selector != "string"){
		return [];
	}
	var s = $.trim(selector);
	var m = quickClass.exec(s);
	var result = [];
	if(m){
		var childNodes = ele.getElementsByTagName(tagName);
		if(m[1] == "%"){
			var attrKey = m[2];
			var attrList = new RegExp("(" + chars+ "*)=\'(.*)\'").exec(attrKey);
			var attrValue = false;
			if(attrList){
				attrKey = attrList[1];
				attrValue = attrList[2];
			}
			for(var i = 0,len = childNodes.length; i < len; i++){
				if(attrValue){
					if(Ylmf.attr(childNodes[i],attrKey) == attrValue){
						result.push(childNodes[i]);
					}
				}
				else{
					if(Ylmf.attr(childNodes[i],attrKey)){
						result.push(childNodes[i]);
					}
				}
			}
		}
		else if(m[1] == "."){
			for(var i = 0,len = childNodes.length; i < len; i++){
				if(Ylmf.filterClass(childNodes[i],m[2])){
					result.push(childNodes[i]);
				}
			}
		}
		else{
			result = ele.getElementsByTagName(m[0]);
		}
	}
	return result;
	
}

//样式设置
Ylmf.style = function( ele, name, value ){
	if(value){
		ele.style[name] = value;
	}
		else{
		if (document.defaultView) {
			return document.defaultView.getComputedStyle(ele, null).getPropertyValue(name);
		}
		else {
			name = name.replace(/\-([a-z])([a-z]?)/ig,
			function(e, d, c) {
				return d.toUpperCase() + c.toLowerCase();
			});
			return ele.currentStyle[name];
		}
	}
}

//页面初始化执行函数
Ylmf.ready = function(fn){
	Ylmf.data.readyFn.push(fn);
	if(!Ylmf.data.isReady){
		Ylmf.event.add(window,"load",function(){
			if (Ylmf.browser.msie && Ylmf.browser.version == 6) {
				document.execCommand("BackgroundImageCache", false, true);
			} 
			for(var i = 0;  i < Ylmf.data.readyFn.length; i++){
				var item = Ylmf.data.readyFn[i];
				item();
			}
		});
		Ylmf.data.isReady = true;
	}
}

//事件函数
Ylmf.event = {
	add: function(elem, type, handler, data) {	
		if(data){
			elem["on" + type] = handler.bindevent(this,data);
		}
		else{
			elem["on" + type] = handler;
		}
	}
}

Ylmf.common = {
	has:function(elem,className){
		return (Ylmf.common.inArray(className,(elem.className || elem).toString().split(/\s+/)) > -1);
	},
	inArray:function(str, array) {
		for ( var i = 0, length = array.length; i < length; i++ ){
			if ( array[i] == str){
				return i;
			}
		}
		return -1;
	}
}

/*
* 
* Cookie 控制
*/
Ylmf.Cookie = {
	Set: function(name, value, hours){
	  var expire = "";
	  if(hours != null){
		expire = new Date((new Date()).getTime() + hours * 3600000);
		expire = "; expires=" + expire.toGMTString();
	  }
	  document.cookie = name + "=" + escape(value) + expire;
	},
	Get: function(name){
	  var cookieValue = "";
	  var search = name + "=";
	  if(document.cookie.length > 0){ 
		offset = document.cookie.indexOf(search);
		if (offset != -1){ 
		  offset += search.length;
		  end = document.cookie.indexOf(";", offset);
		  if (end == -1) end = document.cookie.length;
		  cookieValue = unescape(document.cookie.substring(offset, end))
		}
	  }
	  return cookieValue;
	}
};

/*Ajax 函数
	ajaxstting
		type:类型,
		url:地址,
		content:内容,
		success:传回的内容
*/
Ylmf.ajax = function(ajaxstting) {
	var xhr;

	if(typeof XMLHttpRequest !== 'undefined') xhr = new XMLHttpRequest();
	else {
		var versions = ["Microsoft.XmlHttp", 
						"MSXML2.XmlHttp",
						"MSXML2.XmlHttp.3.0", 
						"MSXML2.XmlHttp.4.0",
						"MSXML2.XmlHttp.5.0"];
		 for(var i = 0, len = versions.length; i < len; i++) {
			try {
				xhr = new ActiveXObject(versions[i]);
				break;
			}
			catch(e){}
		 } // end for
	}
	xhr.onreadystatechange = ensureReadiness;

	function ensureReadiness() {

		if(xhr.readyState < 4) {
			return;
		}
		if(xhr.status !== 200) {
			return;
		}
		if(xhr.readyState == 4) {
			if(ajaxstting.success){
				var data = xhr.responseText;
				if(ajaxstting.dataType && ajaxstting.dataType.toLowerCase() == "json"){
					data = eval("(" + data + ")");
				}
				ajaxstting.success(data);
			}
		}
	}
	if(ajaxstting.content == undefined){
		ajaxstting.content == "";
	}
	xhr.open(ajaxstting.type, ajaxstting.url, true);
	try{
		xhr.setRequestHeader("Content-Length",ajaxstting.content.length);
		xhr.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
	}catch(e){}
	xhr.send(ajaxstting.content);
}

Ylmf.get = function(url,callback){
	url = url + "&redrom=" + new Date();
	Ylmf.ajax({
		type:"GET",
		url:url,
		success:callback
	});
}

Ylmf.getJson = function(url,callback){
	url = url + "&redrom=" + new Date();
	Ylmf.ajax({
		type:"GET",
		url:url,
		dataType:'json',
		success:callback
	});
}

Ylmf.trim = function(text){
	return (text || "").replace( /^\s+|\s+$/g, "" );
}

var $ = Ylmf;
